package CutLoad.cookies
{
	import CutLoad.Base;
	
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.DisplayObject;
	import flash.display.Graphics;
	import flash.display.Sprite;
	import flash.geom.Point;
	import flash.geom.Rectangle;
	
	/**
	 * 画图类 
	 * @author smallerbird mail:smallerbird@gmail.com  site:www.mkigm.com QQ群:49983196
	 * 
	 */
	public class Painter
	{
		public function Painter()
		{
		}
		/**
		 * 给可视对象画相
		 * @param target
		 * @param w 如果为0 则为目标的宽度
		 * @param h 如果为0则为目标的高度
		 * @return 
		 * 
		 */		
		public static function getImg(target:DisplayObject,w:Number=0,h:Number=0):Bitmap{
			if(w==0) w=target.width;
			if(h==0) h=target.height;
			var bd:BitmapData=new BitmapData(w,h,true,0);
			bd.draw(target);
			var img:Bitmap=new Bitmap(bd);
			return img;
		}
		/**
		 * 将BitmapData画到 一个新建的Base里面，并返回该Base
		 * @param bd
		 * @return 
		 * 
		 */		
		public static function drawImg(bd:BitmapData):Base{
			var base:Base=new Base();
			base.graphics.beginBitmapFill(bd);
			base.graphics.drawRect(0,0,bd.width,bd.height);
			base.graphics.endFill();
			return base;
		}
		/**
		 * 获得一个矩形方块
		 * @param w 宽
		 * @param h 高
		 * @param fillcolor 填充色
		 * @param fillAlpha 填充色透明度
		 * @param xx 位置x  是指传出的方块的x
		 * @param yy 位置y 是指传出的方块的y
		 * @param lineThickness 线粗
		 * @param lineColor 线色
		 * @param lineAlpha 线的透明度
		 * @return 
		 * 
		 */		
		public static function getRect(w:Number,h:Number,fillcolor:Number=0xffffff,fillAlpha:Number=1,xx:Number=0,yy:Number=0,lineThickness:Number=0,lineColor:Number=0xff0000,lineAlpha:Number=1):Sprite{
			var spTem:Sprite=new Sprite();
			var gg:Graphics=spTem.graphics;
			if(lineThickness!=0){
				gg.lineStyle(lineThickness,lineColor,lineAlpha);
			}
			
			gg.beginFill(fillcolor,fillAlpha);
			gg.drawRect(xx,yy,w,h);
			gg.endFill();
			return spTem
		}
		/**
		 * 获得一个透明的方块 
		 * @param w 宽度
		 * @param h 高度
		 * @param alpha 透明度 默认为0
		 * @param color 填充色 默认为红色
		 * @return 
		 * 
		 */		
		public static function getAlphaRect(w:Number,h:Number,alpha:Number=0,color:Number=0xff0000):Sprite{
			return getRect(w,h,color,alpha)
		}
		/**
		 * 获得一个矩形方块2  与方法getRect不同之处是传入的是一个Rectangle对象
		 * @param rect 矩形Rectangle的描述
		 * @param fillcolor 填充色
		 * @param fillAlpha 填充色透明度
		 * @param lineThickness 线粗
		 * @param lineColor 线色
		 * @param lineAlpha 线的透明度
		 * @return 
		 * 
		 */		
		public static function getRect2(rect:Rectangle,fillcolor:Number=0xffffff,fillAlpha:Number=1,lineThickness:Number=0,lineColor:Number=0xff0000,lineAlpha:Number=1):Sprite{
			return getRect(rect.width,rect.height,fillcolor,fillAlpha,rect.x,rect.y,lineThickness,lineColor,lineAlpha)
		}
		/**
		 * 画出一个网格
		 * @param line 行
		 * @param column 列
		 * @param tileW 单元格宽
		 * @param tileH 单元格高
		 * @param arrTileConfig 单元格配置信息：数组格式项与Painter.drawRect()提参数一一对应。可以复制以下格式，方便填写: [宽,高,填充色,填充透明度,坐标x,坐标y,父类(可以为空),线粗,线色,线透明度]
		 * @return 返回base,注：其中的额外信息里含有:getOtherInfo().arr(二维数组保存着单元格);
		 * 
		 */		
		public static function drawGrid(line:Number=10,column:Number=10,tileW:Number=10,tileH:Number=10,arrTileConfig:Array=null):Base{
			if(arrTileConfig==null) arrTileConfig=[tileW,tileH,0xffffff,0.5,0,0,null,1,0xff0000,1];
			var arrChildes:Array=new Array();
			var baseReturn:Base=new Base();
			for(var i:Number=0;i<line;i++){
				var arrChildRow:Array=new Array();
				for(var j:Number=0;j<column;j++){
					var baseTile:Base=drawRect(arrTileConfig[0],arrTileConfig[1],arrTileConfig[2],arrTileConfig[3],arrTileConfig[4],arrTileConfig[5],arrTileConfig[6],
						arrTileConfig[7],arrTileConfig[8],arrTileConfig[9]);
					baseTile.setXY(j*tileW,i*tileH);
					baseTile.show(baseReturn);
					arrChildRow.push(baseTile);
				}
				arrChildes.push(arrChildRow);
			}
			baseReturn.setOtherInfo({arr:arrChildes});
			return baseReturn;
			
		}
		/**
		 * 返回一个base矩形方块
		 * @param w
		 * @param h
		 * @param fillcolor
		 * @param fillAlpha
		 * @param xx
		 * @param yy
		 * @param base 如果为空，会自动生成一个base,并在里边画出方块
		 * @param lineSize 线的粗细。如果设置为0就不画线
		 * @param linColor 线的色
		 * @param lineAlpha 线的透明度
		 * @return 
		 * 
		 * 
		 */		
		public static function drawRect(w:Number,h:Number,fillcolor:Number=0xffffff,fillAlpha:Number=1,xx:Number=0,yy:Number=0,base:Base=null,lineSize:Number=0,lineColor:Number=0xffffff,lineAlpha:Number=1):Base{
			if(base==null) base=new Base();
			var gg:Graphics=base.graphics;
			if(lineSize!=0){
				gg.lineStyle(lineSize,lineColor,lineAlpha);
			}
			gg.beginFill(fillcolor,fillAlpha);
			gg.drawRect(xx,yy,w,h);
			gg.endFill();
			return base;
		}
		/**
		 * 画一条线
		 * @param p1 点1
		 * @param p2 点2
		 * @param lineSize 线粗
		 * @param lineColor 线色
		 * @param lineAlpha 线透明度
		 * @return 
		 * 
		 */		
		public static function drawLine(p1:Point,p2:Point,lineSize:Number=0,lineColor:Number=0xffffff,lineAlpha:Number=1):Sprite{
			var sp:Sprite=new Sprite();
			var gg:Graphics=sp.graphics;
			gg.lineStyle(lineSize,lineColor,lineAlpha);
			gg.moveTo(p1.x,p1.y);
			gg.lineTo(p2.x,p2.y);
			return sp;
		}
		/**
		 * 一个圆 
		 * @param rr 半径
		 * @param fillcolor 填充色
		 * @param fillAlpha 填充色透明度
		 * @param base 如果为空，会自动生成一个base,并在里边画出方块
		 * @param lineSize 线粗
		 * @param lineColor 线色
		 * @param lineAlpha 线色透明度
		 * @return 
		 * 
		 */		
		public static function drawCircle(rr:Number,fillcolor:Number=0xffffff,fillAlpha:Number=1,base:Base=null,lineSize:Number=0,lineColor:Number=0xffffff,lineAlpha:Number=1):Base{
			if(base==null) base=new Base();
			var gg:Graphics=base.graphics;
			if(lineSize!=0){
				gg.lineStyle(lineSize,lineColor,lineAlpha);
			}
			gg.beginFill(fillcolor,fillAlpha);
			gg.drawCircle(0,0,rr);
			gg.endFill();
			return base;
		}
		/**
		 * 获得一个随机色块的base 
		 * @param w 宽
		 * @param h 高
		 * @return 
		 * 
		 */		
		public static function getRandColorRect(w:Number=100,h:Number=100):Base{
			return drawRect(w,h,RandNO.getRndColor32());
		}
		/**
		 * 获得一张画有随机数和色的线的图片。
		 * 
		 * @param w 宽
		 * @param h 高
		 * @param lineThickness 线粗
		 * @param lienCount 线的数量
		 * @param bakColor  背景色
		 * @param bakAlpha 背景色透明度
		 * @return 
		 * 
		 */		
		public static function getRandLineRect(w:Number,h:Number,lineThickness:Number,lienCount:Number,bakColor:Number=0xffffff,bakAlpha:Number=1):Bitmap{
			var sp:Sprite=new Sprite();
			var gg:Graphics=sp.graphics;
			gg.beginFill(bakColor,bakAlpha);
			gg.drawRect(0,0,w,h);
			gg.endFill();
			gg.moveTo(0,0);
			for(var i:Number=0;i<=lienCount;i++){
				gg.lineStyle(2,RandNO.getRndColor32());
				gg.lineTo(RandNO.getRndInt(0,w),RandNO.getRndInt(0,h));
				gg.lineTo(RandNO.getRndInt(0,w),RandNO.getRndInt(0,h));
			}
			var bd:BitmapData=new BitmapData(w,h);
			bd.draw(sp);
			var bitmap:Bitmap=new Bitmap(bd);
			return bitmap
		}
		
	}
}